SpringBoot关于@RequestBody请求参数

您所在的位置:网站首页 请求接口是 在body添加参数吗 SpringBoot关于@RequestBody请求参数

SpringBoot关于@RequestBody请求参数

2024-07-15 17:05| 来源: 网络整理| 查看: 265

一.Post请求中Dto参数带@RequestBody

方法代码:

@PostMapping("/test") public UserDto getUserParam( @RequestParam String myName, @RequestHeader(value = "token", required = false) String token, @RequestAttribute(value = "attr", required = false) String attr, @RequestBody UserDto userDto )

1.PostMan请求(Body不写任何东西):

请求结果:

结果返回报错,

我们看下源码,

1.【RequestResponseBodyMethodProcessor 类参数解析器】方法来处理,循环默认的10种消息转换器,找到当前参数类型进行解析

2.这里注意@RequestBody类型参数会用 MappingJackson2HttpMessageConverter 这个消息转换器,

3.判断当前类型无法解析当前参数,返回null,判断为空并且参数是必填的,就会抛出异常

2.PostMan请求(Body只写 {}):

请求结果:

结果返回成功,

我们看下源码,

1.经过消息解析器返回的结果不是null,只不过dto内部属性都是空的,但是并不会报错

二.Post请求中Dto参数不带@RequestBody

方法代码:

@PostMapping("/test") public UserDto getUserParam( @RequestParam String myName, @RequestHeader(value = "token", required = false) String token, @RequestAttribute(value = "attr", required = false) String attr, UserDto userDto )

1.PostMan请求(Body不写任何东西或者写参数信息):

请求结果:

返回结果不报错,但是也没有赋值成功

2.PostMan请求(dto参数写到param参数):

请求结果:

返回结果成功,赋值成功

我们看下源码,

1.【ModelAttributeMethodProcessor 类参数解析器】方法来处理,获取请求中所有以param类型的参数,找到当前dto进行解析,如果找到和dto属性的参数名称一样就赋值

总结:

1.dto实体类型的参数,标注@RequestBody(Default Required=true)注解时,Servlet一定会读取发送的Body体中的json参数,

(1)Body体中什么都不传,返回会报错

(2)Body体中传{},返回不会报错,解析结果是属性为null的dto

(3)Body体中传错误参数的{"a":1},返回不会报错,解析结果是属性为null的dto

(4)【RequestResponseBodyMethodProcessor 类参数解析器】解析参数

2.dto实体类型的参数,什么注解都不标,Servlet会去读取发送的Param类似url?传参的参数

(1)Body体中什么都不传或者传{},返回不会报错,解析结果是属性为null的dto

(2)Param类似url?传参,返回才会成功,解析结果才会成功

(3)【ModelAttributeMethodProcessor 类参数解析器】解析参数



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3